package miniprojet;

import java.io.Serializable;
import java.util.Iterator;
import java.util.List;

/**
 * 
 * Représentation pour tous les transports valides. Un transport possède une
 * capacité de transport, et une liste de trajets.
 * 
 * @author Alexis Laurent & Antoine Lavail
 * @version 2011.11.21
 */
public class Transport implements Serializable {

    /**
     * Enumération de tout les transports disponibles.
     * 
     * @author Alexis Laurent & Antoine Lavail
     * @version 2011.11.21
     */
    public enum EnumTransport {
        // A value for each transport
        AVION("Avion"), BATEAU("Bateau"), TRAIN("Train"), SOUCOUPE("Soucoupe"), BUS(
                "Bus");

        // Field for constructor
        private String transport;

        /**
         * Private enum constructor.
         * 
         * @param transport
         *            : the transport to put in the field.
         */
        private EnumTransport(String transport) {
            this.setTransport(transport);
        }

        /**
         * Getter for transport.
         * 
         * @return the transport
         */
        public String getTransport() {
            return transport;
        }

        /**
         * Setter for transport.
         * 
         * @param transport
         *            the transport to set
         */
        public void setTransport(String transport) {
            this.transport = transport;
        }
    }

    // Attributs

    // Serialization
    static private final long serialVersionUID = 6L;

    // Enum field
    private EnumTransport transport;

    // Capacité d'un transport
    private Integer capacite;

    // Liste des trajets d'un transport
    private List<Trajet> trajets;

    /**
     * Constructeur de transport
     * 
     * @param transport
     *            : une instance de l'énumération transport
     * @param capacite
     *            : la capacité voulue pour le transport.
     */
    public Transport(EnumTransport transport, int capacite) {
        this.transport = transport;
        this.capacite = capacite;
    }

    /**
     * Deuxième constructeur de transport.
     * @param transport : une instance de l'énumération transport.
     * @param capacite : la capacité voulue pour le transport.
     * @param t : la liste des trajets du transport.
     */
    public Transport(EnumTransport transport, int capacite, List<Trajet> t) {
        this.transport = transport;
        this.capacite = capacite;
        this.trajets = t;
    }

    /**
     * Méthode permettant, pour un transport, d'ajouter un trajet.
     * 
     * @param trajet
     *            : le trajet à ajouter à la liste de trajets.
     */
    public void addTrajet(Trajet trajet) {

        Iterator<Trajet> it = trajets.iterator();
        while (it.hasNext()) {
            Trajet t = it.next();
            if (t.equals(trajet)) {
                return;
            }
        }
        this.trajets.add(trajet);
    }

    /**
     * Méthode permettant, pour un transport, de supprimer un trajet
     * 
     * @param trajet
     *            : le trajet à supprimer à la liste de trajets.
     */
    public void removeTrajet(Trajet trajet) {

        Iterator<Trajet> it = trajets.iterator();
        while (it.hasNext()) {
            Trajet t = it.next();
            if (t.equals(trajet)) {
                trajets.remove(trajet);
                return;
            }
        }
    }

    /**
     * Getter pour les types de transport.
     * 
     * @return le type de transport.
     */
    public String getTransport() {
        return this.transport.getTransport();
    }

    /**
     * Getter pour la capacité de transport.
     * 
     * @return la capacité d'un transport.
     */
    public Integer getCapacity() {
        return capacite;
    }

    /**
     * Setter pour la capacité de transport.
     * 
     * @param capacity
     *            : la nouvelle capacité du transport.
     */
    public void setCapacity(Integer capacity) {
        if (this.verifyCapacity(capacity))
            this.capacite = capacity;
        else
            capacite = 1;
    }

    /**
     * Getter pour la liste des trajets d'un transport.
     * 
     * @return la liste des trajets pour le transport courant.
     */
    public List<Trajet> getTrajets() {
        return trajets;
    }

    /**
     * Setter pour les trajets d'un transport. Permet de modifier la liste de
     * trajets d'un transport.
     * 
     * @param trajets
     *            : la nouvelle liste de trajets du transport.
     */
    public void setTrajets(List<Trajet> trajets) {
        this.trajets = trajets;
    }

    public Boolean verifyCapacity(Integer capacity) {
        if (capacity >= 1 && capacity <= 1000)
            return true;
        else
            return false;
    }

    /**
     * Méthode qui permet de vérifier l'égalité entre deux transports.
     * 
     * @param t
     *            : le transport
     * @param cap
     *            : la capacité du transport
     * @param trajets
     *            : la liste de trajets du transport
     * @return true si les deux transports sont égaux. false sinon.
     */

    @Override
    public boolean equals(Object obj) {
        if (((Transport) obj).getTransport().equals(this.getTransport())) {
            if (((Transport) obj).getCapacity().equals(this.getCapacity())) {
                if (((Transport) obj).getTrajets().equals(this.getTrajets())) {
                    return true;
                }
            }
        }
        return false;
    }

}
